<!doctype html>
<html>
  <head>
    <meta charset="utf-8">
    <title>Ember.js • Guides • enumerable API</title>
    
  <script src="http://cdn.bootcss.com/jquery/2.0.0/jquery.js"></script>
   <script src="http://cdn.bootcss.com/ember.js/2.1.0-beta.2/ember.debug.js"></script>
    
<script type="text/javascript">
//enumerable API 使用
// 数组遍历
var arr = ['chen', 'ubuntuvm', '1527254027@qq.com', 'i2cao.xyz', 'ubuntuvim.xyz'];
arr.forEach(function(item, index) {
  console.log(index+1 + ", " +item);
});


//  获取头尾的元素，直接调用Ember封装好的firstObject和lastObject方法即可
console.log('The firstItem is ' + arr.get('firstObject'));  // output> chen
console.log('The lastItem is ' + arr.get('lastObject'));  //output> ubuntuvim.xyz

console.log('-----------------------------------------------');

//  map方法，转换数组，并且可以在回调函数里添加自己的逻辑
//  map方法会新建一个数组，并且返回被转换数组的元素
var arrMap = arr.map(function(item) {
  return 'map: ' + item;  //  增加自己的所需要的逻辑处理
});
arrMap.forEach(function(item, index) {
  console.log(item);
});
console.log('-----------------------------------------------');

// mapBy 方法：返回对象属性的集合，
// 当你的数组元素是一个对象的时候，你可以根据对象的属性名获取对应值
var obj1 = Ember.Object.create({
  username: '123',
  age: 25
});

var obj2 = Ember.Object.create({
  username: 'name',
  age: 35
});
var obj3 = Ember.Object.create({
  username: 'user',
  age: 40
});

var obj4 = Ember.Object.create({
  age: 40
});

var arrObj = [obj1, obj2, obj3, obj4];  //对象数组
var tmp = arrObj.mapBy('username');  //  

tmp.forEach(function(item, index) {
  console.log(index+1+", "+item);
});

console.log('-----------------------------------------------');

//  filter 过滤器方法，过滤普通数组元素
//  filter方法可以跟你指定的条件过滤掉不匹配的数据，比如下面的代码：过滤了元素大于4的元素
var nums = [1, 2, 3, 4, 5];
//  参数self值数组本身
var numsTmp = nums.filter(function(item, index, self) {
  if (item < 4)
    return true;

});

numsTmp.forEach(function(item, index) {
  console.log('item = ' + item);  //  1， 2， 3
});
console.log('-----------------------------------------------');


//  如果你想根据对象的某个属性过滤数组你需要用filterBy方法，比如下面的代码根据isDone这个对象属性过滤
var o1 = Ember.Object.create({
  name: 'u1',
  isDone: true
});

var o2 = Ember.Object.create({
  name: 'u2',
  isDone: false
});

var o3 = Ember.Object.create({
  name: 'u3',
  isDone: true
});

var o4 = Ember.Object.create({
  name: 'u4',
  isDone: true
});

var todos = [o1, o2, o3, o4];
var isDoneArr = todos.filterBy('isDone', true);  //会把o2过滤掉
isDoneArr.forEach(function(item, index) {
  console.log('name = ' + item.get('name') + ', isDone = ' + item.get('isDone'));
  // console.log(item);
});

console.log('-----------------------------------------------');

// find和findBy方法，这两个方法都是只返回第一个匹配的元素，与filter和filterBy类似，一个用于返回普通的元素，一个可以用于对象属性判断
var firstNum = nums.find(function(item, index, seft){
  return item < 4;
});
console.log('firstNum = ' + firstNum);

var firstObjAttr = todos.findBy('isDone', true);
console.log('name = ' + firstObjAttr.get('name') + ', isDone = ' + firstObjAttr.get('isDone'));

console.log('-----------------------------------------------');
// every、some 方法
// every 用于判断数组的所有元素是否符合条件，如果所有元素都符合指定的判断条件则返回true，否则返回false
// some 用于判断数组的所有元素只要有一个元素符合条件就返回true，否则返回false
Person = Ember.Object.extend({
  name: null,
  isHappy: true
});
var people = [
  Person.create({ name: 'chen', isHappy: true }),
  Person.create({ name: 'ubuntuvim', isHappy: false }),
  Person.create({ name: 'i2cao.xyz', isHappy: true }),
  Person.create({ name: '123', isHappy: false }),
  Person.create({ name: 'ibeginner.sinaapp.com', isHappy: false })
];
var every = people.every(function(person, index, self) {
  if (person.get('isHappy')) 
    return true;
});
console.log('every = ' + every);

var some = people.some(function(person, index, self) {
  if (person.get('isHappy'))
    return true;
});
console.log('some = ' + some);

//  与every、some类似的方法还有isEvery、isAny
//  
console.log('isEvery = ' + people.isEvery('isHappy', true));  //  全部都为true，返回结果才是true
console.log('isAny = ' + people.isAny('isHappy', true));  //只要有一个为true，返回结果就是true

</script>
 
 
  </head>  
   
  <body>
  </body>

</html>